package utile

import (
	"fmt"
	"github.com/hpcloud/tail"
	"strings"
	"sync"
	"time"
)

type TailMgr struct {
	TailObjMap map[string]*TailObj
	lock       sync.Mutex
}

type TailObj struct {
	Tail     *tail.Tail
	Offset   int    //记录当前位置
	FileName string //文件名称
	FilePath string //文件路径
	Ext      string //文件后缀
	Id       string
	status   int
	exitChan chan int
}

var tailMgr = &TailMgr{}

func NewTailMgr() *TailMgr {
	tailMgr.TailObjMap = make(map[string]*TailObj, 0)
	return tailMgr
}

func GetTailMgr() *TailMgr {
	return tailMgr
}

func (t *TailMgr) AddLogFile(fileName string) error {
	t.lock.Lock()
	defer t.lock.Unlock()
	_, ok := t.TailObjMap[fileName]
	if ok {
		return fmt.Errorf("duplicate filename:%s\n", fileName)
	}
	strArrTemp := strings.Split(fileName, ".")
	strArr := strings.Split(strArrTemp[0], "/")
	var filePath string
	for i := 0; i < len(strArr)-1; i++ {
		if i == 0 {
			filePath += strArr[i]
		} else {
			filePath += "/" + strArr[i]
		}
	}
	tailObj := &TailObj{
		Offset:   0,
		FileName: strArr[len(strArr)-1],
		FilePath: filePath,
		Ext:      strArrTemp[1],
		Id:       time.Now().Format("15:04:05"),
	}
	t.TailObjMap[fileName] = tailObj
	return nil
}

//读取日志
//func (t *TailObj) ReadLog() {
//	log.Printf("Watching log file [ %s ] ...\n", t.FileName)
//	date := time.Now().Format("20060102")
//	fileName := fmt.Sprintf("%s/%s-%s.%s", t.FilePath, t.FileName, date, t.Ext)
//	if t.Tail == nil {
//		tf, err := tail.TailFile(fileName, tail.Config{
//			ReOpen:    true,
//			Follow:    true,
//			Location:  &tail.SeekInfo{Offset: 0, Whence: 2},
//			MustExist: false,
//			Poll:      true,
//		})
//		if err != nil {
//			return
//		}
//		t.Tail = tf
//	}
//	fmt.Printf("--------------- before filename: %s -------------\n", t.Tail.Filename)
//	//日志按天生成，需比对文件名，来读取最新的日志文件
//	if strings.Compare(t.Tail.Filename, fileName) != 0 {
//		tf, err := tail.TailFile(fileName, tail.Config{
//			ReOpen:    true,
//			Follow:    true,
//			Location:  &tail.SeekInfo{Offset: 0, Whence: 2},
//			MustExist: false,
//			Poll:      true,
//		})
//		if err != nil {
//			return
//		}
//		t.Tail = tf
//	}
//	fmt.Printf("--------------- after filename: %s -------------\n", t.Tail.Filename)
//	//读取每行日志内容
//	for line := range t.Tail.Lines {
//		if line.Err != nil {
//			logger.Errorf("read line failed,err:%v", line.Err)
//			continue
//		}
//		str := strings.TrimSpace(line.Text)
//		if len(str) == 0 || str[0] == '\n' {
//			fmt.Println("------------- no read------------")
//			continue
//		}
//		fmt.Printf("-------------------------------读取到日志 [ %s ] [ %s ]：%s\n", t.Tail.Filename, t.Id, str)
//	}
//}

//func (t *TailMgr) UpdateConfig() {
//	fmt.Println("监控日志变化 UpdateConfig")
//	conf := config.GetConfig()
//	for _, logfile := range conf.Data.LogFiles {
//		var isNew = true
//		//配置变动文件被放弃监控，从map中剔除，并close对应的监控goroutine
//		for filename, _ := range t.TailObjMap {
//			if filename == logfile {
//				isNew = false
//				break
//			}
//		}
//		if isNew {
//			fmt.Println("add watching new log file: " + logfile)
//			t.AddLogFile(logfile)
//			go t.TailObjMap[logfile].ReadLog()
//		}
//	}
//	var status int
//	for filename, tailobj := range t.TailObjMap {
//		status = StatusDelete
//		for _, logfile := range conf.Data.LogFiles {
//			if filename == logfile {
//				status = StatusNormal
//				break
//			}
//		}
//		//配置变动文件被放弃监控，从map中剔除，并close对应的监控goroutine
//		if status == StatusDelete {
//			fmt.Println("release watching log file: " + filename)
//			delete(t.TailObjMap, filename)
//			tailobj.Tail.Stop()
//			continue
//		}
//	}
//}
